﻿Imports DTO
Imports System.Data.SqlClient

Public Class TipoProdutoDAL

#Region "Métodos"
    ''' <summary>
    ''' Método responsável incluir um tipo de produto na base de dados
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Incluir(tipoProduto As TipoProdutoDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_INSERIR_TIPOPRODUTO " & _
                     " @Nome, @Descricao"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 50).Value = tipoProduto.pNome
                    cmd.Parameters.Add("@Descricao", SqlDbType.VarChar, 200).Value = tipoProduto.pDescricao

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As SqlException
                    'Erro nº 2627 do SQLException indica chave primaria duplicada
                    If ex.Number = 2627 Then
                        Throw New Exception("Já existe um tipo de produto cadastrado!")
                    Else
                        Throw ex
                    End If
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para alterar um determinado tipo de produto através de seu código
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Alterar(tipoProduto As TipoProdutoDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_ALTERAR_TIPOPRODUTO " & _
                     " @Codigo, @Nome, @Descricao"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Codigo", SqlDbType.Int).Value = tipoProduto.pCodigo
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 50).Value = tipoProduto.pNome
                    cmd.Parameters.Add("@Descricao", SqlDbType.VarChar, 200).Value = tipoProduto.pDescricao

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para excluir o tipo de produto passando como parâmetro o código
    ''' </summary>
    ''' <param name="codigo"></param>
    ''' <remarks></remarks>
    Public Sub Excluir(codigo As Integer)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_EXCLUIR_TIPOPRODUTO " & _
                     " @Codigo"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Codigo", SqlDbType.Int).Value = codigo

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método responsável por listar tipos de produto ativos
    ''' </summary>
    ''' <param name="codigo"></param>
    ''' <remarks></remarks>
    Public Function Consultar(codigo As Integer) As TipoProdutoDTO
        Dim reader As SqlDataReader
        Dim strSql As String
        Dim objTipoProduto As New TipoProdutoDTO
        Try
            Using conn As New SqlConnection(My.Settings.Conexao)
                strSql = "SELECT * FROM TIPOPRODUTO WHERE Codigo=@Codigo AND Ativo=1"
                Using cmd As New SqlCommand(strSql, conn)
                    cmd.Parameters.Add("@Codigo", SqlDbType.Int).Value = codigo

                    conn.Open()
                    reader = cmd.ExecuteReader

                    'Se ele encontrou algum registro, preenche o objeto
                    If reader.Read() Then
                        objTipoProduto.pCodigo = reader.Item("Codigo")
                        objTipoProduto.pNome = reader.Item("Nome")
                        objTipoProduto.pDescricao = reader.Item("Descricao")
                    End If
                    reader.Close()

                End Using
            End Using
            Return objTipoProduto
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    ''' <summary>
    ''' Método responsável por listar todos os tipos de produto existentes e ativos
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Listar() As List(Of TipoProdutoDTO)
        Dim strSQL As String
        Dim reader As SqlDataReader
        Dim objTipoProduto As TipoProdutoDTO
        Dim listaTipoProduto As New List(Of TipoProdutoDTO)


        Using conn As New SqlConnection(My.Settings.Conexao)
            'conn.ConnectionString = My.Settings.StringConexao
            strSQL = "SELECT * FROM TB_TIPOPRODUTO WHERE Ativo=1"

            Using cmd As New SqlCommand(strSQL, conn)
                Try
                    'Cria parâmetro

                    conn.Open() 'Abre conexão

                    reader = cmd.ExecuteReader

                    Do While reader.Read
                        'Instacia um novo objeto clsCliente e preenche este obj com info do bd
                        objTipoProduto = New TipoProdutoDTO

                        With objTipoProduto
                            .pCodigo = reader.Item("Codigo")
                            .pNome = reader.Item("Nome")
                            .pDescricao = reader.Item("Descricao")
                        End With

                        'adicionar na lista
                        listaTipoProduto.Add(objTipoProduto)

                    Loop
                    'fecha o cursos
                    reader.Close()

                    Return listaTipoProduto

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function
#End Region

End Class
